home *** CD-ROM | disk | FTP | other *** search
/ Celestin Apprentice 5 / Apprentice-Release5.iso / Source Code / PowerPlant / AGA Classes 1.2 / Utilities / LAGADiscloTriangle.cp < prev    next >
Text File  |  1996-06-30  |  6KB  |  258 lines

  1. // ===========================================================================
  2. //    LAGADiscloTriangle.cp
  3. // ===========================================================================
  4. //    “Apple Grayscale Appearance” compliant right-hand disclosure triangle. 
  5. // Uses the same PPob as LStdCheckBox. A left-hand version is left as an
  6. // exercise for the reader :-).
  7. //
  8. // Copyright 1996 by Michael™ Hamel of ADInstruments NZ Ltd, mhamel@adi.co.nz
  9. //
  10. //    You may use this source code in any application (commercial, shareware, freeware,
  11. //    postcardware, etc), without acknowledgment, but may not remove this notice.
  12. //
  13. //    You may not sell this source code in any form. This source code may be placed on 
  14. //    publicly accessible archive sites and source code disks. It may not be placed on 
  15. //    for-profit archive sites and source code disks without the permission of the author.
  16. //
  17. //     This source code is distributed "as is", without any warranty. Use it at your own
  18. //  risk.
  19. //
  20. //        This class requires AGAColors.cp to be present in your project
  21. //
  22. //        Version : 1.2
  23. //
  24. //        Change History (most recent first, date in US form : mm/dd/yy):
  25. //
  26. //                        06/30/96    ca        Public release of version 1.2
  27. //                        06/27/96    ca        Changed checks for disabled state (check on triState_On instead of triState_Off)
  28. //                                                            in order that triState_Latent state is drawn as disabled
  29. //                        06/04/96    ca        Added RegisterClass method to ease registry
  30. //                                                        Increased version to 1.2
  31. //                        05/21/96    M™H    Initial version set to 1.1 to be put with other AGA classes
  32. //
  33. //        To Do:
  34. //
  35.  
  36. #include "LAGADiscloTriangle.h"
  37. #include "AGAColors.h"
  38. #include <UTextTraits.h>
  39. #include <UDrawingState.h>
  40. #include <UDrawingUtils.h>
  41. #include <LStream.h>
  42.  
  43. enum {
  44.     kTextStart = 14
  45. };
  46.  
  47. //    begin    <06/04/96    ca>
  48. void LAGADiscloTriangle::RegisterClass ()
  49.  
  50. {
  51.     URegistrar::RegisterClass(LAGADiscloTriangle::class_ID, (ClassCreatorFunc)LAGADiscloTriangle::CreateAGADiscloTriangleStream);
  52. }
  53. //    end    <06/04/96    ca>
  54.  
  55. LAGADiscloTriangle*
  56. LAGADiscloTriangle::CreateAGADiscloTriangleStream( LStream    *inStream)
  57. {
  58.     return (new LAGADiscloTriangle(inStream));
  59. }
  60.  
  61. LAGADiscloTriangle::LAGADiscloTriangle()
  62. :LControl()
  63. {
  64. }
  65.  
  66. LAGADiscloTriangle::LAGADiscloTriangle(const SPaneInfo &inPaneInfo, 
  67.                                                     MessageT inValueMessage,
  68.                                                      Int32 inValue,
  69.                                                      ResIDT traitsID,
  70.                                                      Str255 title)
  71. :LControl(inPaneInfo,inValueMessage,inValue,0,1)
  72. {
  73.     mTitle = title;
  74.     mTextTraitsID = traitsID;
  75. }
  76.  
  77. LAGADiscloTriangle::LAGADiscloTriangle( LStream    *inStream)
  78. : LControl(inStream)
  79. {
  80.     Int16        controlKind;
  81.     Int32        macRefCon;
  82.     
  83.     inStream->ReadData(&controlKind, sizeof(Int16));    // ignored
  84.     inStream->ReadData(&mTextTraitsID, sizeof(ResIDT));
  85.     inStream->ReadPString(mTitle);
  86.     inStream->ReadData(&macRefCon, sizeof(Int32));        // ignored
  87. }
  88.  
  89. LAGADiscloTriangle::~LAGADiscloTriangle()
  90. {
  91. }
  92.  
  93. void
  94. LAGADiscloTriangle::SetValue(Int32    inValue)
  95. {
  96.     Int32 oldValue;
  97.     
  98.     oldValue = mValue;
  99.     LControl::SetValue(inValue);
  100.     if (oldValue != mValue) Draw(nil);
  101. }
  102.  
  103. void 
  104. LAGADiscloTriangle::DrawText ( )
  105. {
  106.     Rect        frame;
  107.     FontInfo    info;
  108.     short        space,
  109.                 alignment;
  110.     RGBColor textColor;
  111.     
  112.     if (CalcLocalFrameRect(frame)) {
  113.         frame.left += kTextStart;
  114.         alignment = UTextTraits::SetPortTextTraits(mTextTraitsID);
  115.               
  116.         // Get the font centered top/bottom
  117.         ::GetFontInfo(&info);
  118.         space = (frame.bottom - frame.top - (info.ascent + info.descent))/2;
  119.         frame.top += space;
  120.         frame.bottom -= space;
  121.         
  122.         if (mInColor) {
  123.             ::GetForeColor(&textColor);
  124.     
  125.             ApplyForeAndBackColors();
  126.             if (mEnabled == triState_On)                                                                                        //    <06/27/96    ca>
  127.                 ::RGBForeColor(&textColor);
  128.             else
  129.                 ::RGBForeColor(&gAGAColorArray[7]);
  130.         }
  131.         UTextDrawing::DrawWithJustification((Ptr)&mTitle[1], mTitle[0], frame, alignment);
  132.     }
  133. }
  134.  
  135. void
  136. LAGADiscloTriangle::DrawTriangle(TriangleState stage, Boolean hilite)
  137. {
  138.     enum {
  139.         kArrowSpace = 13,
  140.         kArrowHeight = 10
  141.     };
  142.     
  143.     Rect cSpace;
  144.     PolyHandle aPoly;
  145.     short extra;
  146.     
  147.     CalcLocalFrameRect(cSpace);
  148.     cSpace.right = cSpace.left + kArrowSpace;
  149.     extra = (cSpace.bottom - cSpace.top - kArrowHeight)/2;
  150.     aPoly = ::OpenPoly();
  151.     switch (stage) {
  152.         case kDown : // Down-arrow 
  153.                    ::MoveTo(cSpace.left,cSpace.top+extra+3);
  154.                    ::Line(5,5);
  155.                    ::Line(5,-5);
  156.                    ::Line(-10,0);
  157.                     break;
  158.                     
  159.         case kIntermediate : // Intermediate-arrow 
  160.                    ::MoveTo(cSpace.left,cSpace.top+extra+7);
  161.                    ::Line(7,0);
  162.                    ::Line(0,-7);
  163.                    ::Line(-7,7);
  164.                     break;
  165.                     
  166.         case kRight : // Right-arrow
  167.                    ::MoveTo(cSpace.left+3,cSpace.top+extra);
  168.                    ::Line(0,10);
  169.                    ::Line(5,-5);
  170.                    ::Line(-5,-5);
  171.                     break;
  172.     }
  173.     ::ClosePoly();
  174.     
  175.     if (mInColor) ApplyForeAndBackColors();
  176.     EraseRect(&cSpace);
  177.     if (mEnabled != triState_On) {                                                                                    //    <06/27/96    ca>
  178.         if (!mInColor)
  179.             ::FillPoly(aPoly,&qd.gray);
  180.         else {
  181.             ::RGBForeColor(&gAGAColorArray[5]);
  182.             ::PaintPoly(aPoly);
  183.         }
  184.     }
  185.     else {
  186.         if (hilite) {
  187.             if (mInColor) ::RGBForeColor(&gAGAColorArray[A4]);
  188.                         else ::ForeColor(blackColor);
  189.             ::PaintPoly(aPoly);
  190.         }
  191.         else if (mInColor) {
  192.             // Interior colors
  193.             ::RGBForeColor(&gAGAColorArray[A2]);
  194.             ::PaintPoly(aPoly);
  195.             ::RGBForeColor(&gAGAColorArray[A1]);
  196.             if (stage==kDown) {
  197.                 ::MoveTo(cSpace.left+2,cSpace.top+extra+4);
  198.                 ::Line(5,0);
  199.                 ::Move(0,1);
  200.                 ::RGBForeColor(&gAGAColorArray[A3]);
  201.                 ::Line(-2,2);
  202.                 ::Move(4,-4);
  203.             }
  204.             else {
  205.                 ::MoveTo(cSpace.left+4,cSpace.top+extra+2);
  206.                 ::Line(0,5);
  207.                 ::Move(1,0);
  208.                 ::RGBForeColor(&gAGAColorArray[A3]);
  209.                 ::Line(2,-2);
  210.             }
  211.             // Shadow
  212.             ::RGBForeColor(&gAGAColorArray[7]);
  213.             ::Move(1,1);
  214.             ::Line(-4,4);
  215.             ::RGBForeColor(&gAGAColorArray[4]);
  216.             ::Move(0,1);
  217.             ::Line(5,-5);
  218.         }
  219.         ::ForeColor(blackColor);
  220.         ::FramePoly(aPoly);
  221.     }
  222.     ::KillPoly(aPoly);
  223. }
  224.  
  225. void
  226. LAGADiscloTriangle::DrawSelf()
  227. {
  228.     StColorPenState  savedState;    
  229.     
  230.     mInColor = PaneInColor(this);
  231.     DrawText();
  232.     if (mValue!=0) DrawTriangle(kDown,FALSE);
  233.                  else DrawTriangle(kRight,FALSE);
  234. }
  235.  
  236. void
  237. LAGADiscloTriangle::HotSpotAction(short    inHotSpot,
  238.                                               Boolean    inCurrInside,
  239.                                               Boolean    inPrevInside)
  240. {
  241.     if (inCurrInside != inPrevInside) {
  242.         StColorPenState  savedState;        
  243.         FocusDraw();
  244.         if (GetValue()!=0) DrawTriangle(kDown,inCurrInside);
  245.                           else DrawTriangle(kRight,inCurrInside);
  246.     }
  247. }
  248.  
  249. void
  250. LAGADiscloTriangle::HotSpotResult(short    inHotSpot)
  251. // Animate through intermediate step
  252. {
  253.     long t = ::TickCount()+3;
  254.     DrawTriangle(kIntermediate,TRUE);
  255.     while (::TickCount()<t) {} ;
  256.     SetValue(1-GetValue());
  257. }
  258.